#include <My_Inc/PHY/PHY_my_iic_LL.h>

// 微秒延时函数
void OLED_Delay_us_LL(uint32_t us)
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 170000000 * us);
    while(delay--);
}

// 设置SDA为输入模式
void OLED_SDA_IN_LL(void)
{
/*    LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = OLED_SDA_PIN;
    GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
    GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;

    LL_GPIO_Init(OLED_SDA_PORT, &GPIO_InitStruct);*/
}

// 设置SDA为输出模式
void OLED_SDA_OUT_LL(void)
{
/*    LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = OLED_SDA_PIN;
    GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
    GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
    GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
    GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;

    LL_GPIO_Init(OLED_SDA_PORT, &GPIO_InitStruct);*/
}

// I2C起始信号
void OLED_I2C_Start_LL(void)
{
//    OLED_SDA_OUT_LL();
    SDA_H;
    SCL_H;
    OLED_Delay_us_LL(4);
    SDA_L;
    OLED_Delay_us_LL(4);
    SCL_L;
}

// I2C停止信号
void OLED_I2C_Stop_LL(void)
{
//    OLED_SDA_OUT_LL();
    SCL_L;
    SDA_L;
    OLED_Delay_us_LL(4);
    SCL_H;
    OLED_Delay_us_LL(4);
    SDA_H;
    OLED_Delay_us_LL(4);
}

// 等待应答
uint8_t OLED_I2C_Wait_Ack_LL(void)
{
    uint8_t ucErrTime = 0;
    
//    OLED_SDA_IN_LL();
    SDA_H;
    OLED_Delay_us_LL(1);
    SCL_H;
    OLED_Delay_us_LL(1);
    
    while(LL_GPIO_IsInputPinSet(OLED_SDA_PORT, OLED_SDA_PIN))
    {
        ucErrTime++;
        if(ucErrTime > 250)
        {
            OLED_I2C_Stop_LL();
            return 1;
        }
    }
    
    SCL_L;
    return 0;
}

// 发送一个字节
void OLED_I2C_Send_Byte_LL(uint8_t txd)
{
//    OLED_SDA_OUT_LL();
    SCL_L;
    
    for(uint8_t t = 0; t < 8; t++)
    {
        if((txd & 0x80) >> 7)
            SDA_H;
        else
            SDA_L;
        
        txd <<= 1;
        OLED_Delay_us_LL(2);
        SCL_H;
        OLED_Delay_us_LL(2);
        SCL_L;
        OLED_Delay_us_LL(2);
    }
}
